'''
一个社会实验：
    一个社会n个人。初始大家分别都有100元
    在每一轮，每个人给随机一个人一元。       (完全随机)
    如果在一轮一个人没有钱，可以不给出钱，但还可以接受钱。     （照顾贫穷人）
    在t轮后，社会的财富是否均匀？

    基尼系数: 表示一个社会财富分配是否均匀。
    0：完全均匀， 1: 一个人掌握所有财富。
    社会学认为: 0.5即表示社会很动乱了，财富不均。有大量抢劫，犯罪，等等
    D_(i,j) = |Money_(i) - Money_(j)|
    基尼系数 = sum(D) / (2 * n * total_money)
'''
import random
from itertools import product
from typing import List


def gini(wealths: List[int]) -> float:
    total_wealths = sum(wealths)
    total_distance = sum(abs(a - b) for a, b in product(wealths, repeat=2))
    return total_distance / (2 * len(wealths) * total_wealths)


def experiment(n: int, t: int):
    wealths = [100] * n
    for _ in range(t):
        for i in range(n):
            if not wealths[i]: continue
            j = random.randint(0, n - 1)
            while j == i:
                j = random.randint(0, n - 1)
            wealths[i] -= 1
            wealths[j] += 1
    print("财富分布情况：")
    print(wealths)
    print(f"社会基尼系数: {gini(wealths)}")
    return gini(wealths)


n = 100
t = int(10e3)
print(f'社会总人数: {n}, 共进行{t}轮财富分配')
experiment(n, t)
print("实验结束")
